/*
 * @(#)TintFilter.java 8/17/2011
 *
 * Copyright 2002 - 2011 JIDE Software Inc. All rights reserved.
 */

package com.element.ui.icons;

import java.awt.*;
import java.awt.image.FilteredImageSource;
import java.awt.image.ImageProducer;
import java.awt.image.RGBImageFilter;

/**
 * An image filter that tints the image with a color.
 */
public class TintFilter extends RGBImageFilter {
	private int _alpha, _red, _green, _blue;
	private int _width, _height;
	private Insets _insets;

	public TintFilter(Color color, int width, int height, Insets insets) {
		_alpha = color.getAlpha();
		_red = color.getRed();
		_green = color.getGreen();
		_blue = color.getBlue();
		_width = width;
		_height = height;
		_insets = insets;
		canFilterIndexColorModel = true;
	}

	public int filterRGB(int x, int y, int rgb) {
		if (_insets != null && (x < _insets.left || x > _width - _insets.right - 1 || y < _insets.top || y > _height - _insets.bottom - 1)) {
			return rgb;
		} else {
			Color color = new Color(rgb, true);
			int r = Math.min(Math.max(color.getRed() + (color.getRed() * _red) / 100, 0), 255);
			int g = Math.min(Math.max(color.getGreen() + (color.getGreen() * _green) / 100, 0), 255);
			int b = Math.min(Math.max(color.getBlue() + (color.getBlue() * _blue) / 100, 0), 255);
			int a = Math.min(Math.max(color.getAlpha() + (color.getAlpha() * _alpha) / 100, 0), 255);
			return a << 24 | r << 16 | g << 8 | b;
		}
	}

	/**
	 * Creates a tinted image
	 *
	 * @param i      the original image
	 * @param color  the color to be tinted
	 * @param insets the insets. The border area with the insets will not be tinted.
	 * @return a tinted image
	 */
	public static Image createTintedImage(Image i, Color color, Insets insets) {
		TintFilter filter = new TintFilter(color, i.getWidth(null), i.getHeight(null), insets);
		ImageProducer prod = new FilteredImageSource(i.getSource(), filter);
		return Toolkit.getDefaultToolkit().createImage(prod);
	}
}
